package com.tte.common.hutool;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.*;
import cn.hutool.core.lang.Console;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * https://blog.csdn.net/abst122/article/details/124091375
 */
public class HuToolTest {

    /**
     * Convert类可以说是一个工具方法类，里面封装了针对Java常见类型的转换，用于简化类型转换。
     * Convert类中大部分方法为toXXX，参数为Object，可以实现将任意可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值
     */
    public void convert(){
        //转换为字符串
        int a = 1;
        String aStr = Convert.toStr(a);
        //转换为指定类型数组
        String[] b = {"1", "2", "3", "4"};
        Integer[] intArray = Convert.toIntArray(b);
        //转换为日期对象
        String dateStr = "2022-09-28";
        Date date = Convert.toDate(dateStr);
        //转换为列表
        String[] strArr = {"a", "b", "c", "d"};
        List<String> strList = Convert.toList(String.class, strArr);
        Object[] a1 = {"a", "你", "好", "", 1};
        List<?> list = Convert.convert(List.class, a);
        //从4.1.11开始可以这么用
        List<?> list1 = Convert.toList(a);
    }

    /**
     * Date、long、Calendar之间的相互转换
     */
    public void dateUtil(){
        //当前时间
        Date date = DateUtil.date();
        //当前时间
        Date date2 = DateUtil.date(Calendar.getInstance());
        //当前时间
        Date date3 = DateUtil.date(System.currentTimeMillis());
        //当前时间字符串，格式：yyyy-MM-dd HH:mm:ss
        String now = DateUtil.now();
        //当前日期字符串，格式：yyyy-MM-dd
        String today= DateUtil.today();

    }

    /**
     * 字符串转日期
     * DateUtil.parse方法会自动识别一些常用格式，包括：
     * yyyy-MM-dd HH:mm:ss
     * yyyy/MM/dd HH:mm:ss
     * yyyy.MM.dd HH:mm:ss
     * yyyy年MM月dd日 HH时mm分ss秒
     * yyyy-MM-dd
     * yyyy/MM/dd
     * yyyy.MM.dd
     * HH:mm:ss
     * HH时mm分ss秒
     * yyyy-MM-dd HH:mm
     * yyyy-MM-dd HH:mm:ss.SSS
     */
    public void strToDate(){
        String dateStr = "2017-03-01";
        Date date = DateUtil.parse(dateStr);
        //String dateStr = "2017-03-01";
        //Date date = DateUtil.parse(dateStr, "yyyy-MM-dd");
        String dateStr1 = "2017-03-01";
        Date date1 = DateUtil.parse(dateStr1, "yyyy-MM-dd");

        //格式化日期输出
        String dateStr2 = "2017-03-01";
        Date date2 = DateUtil.parse(dateStr);
        //结果 2017/03/01
        String format = DateUtil.format(date2, "yyyy/MM/dd");
        //常用格式的格式化，结果：2017-03-01
        String formatDate = DateUtil.formatDate(date2);
        //结果：2017-03-01 00:00:00
        String formatDateTime = DateUtil.formatDateTime(date2);
        //结果：00:00:00
        String formatTime = DateUtil.formatTime(date2);

        //获取Date对象的某个部分
        Date date3 = DateUtil.date();
        //获得年的部分
        DateUtil.year(date3);
        //获得月份，从0开始计数
        DateUtil.month(date3);
        //获得月份枚举
        DateUtil.monthEnum(date3);

        //开始和结束时间
        //有的时候我们需要获得每天的开始时间、结束时间，每月的开始和结束时间等等，DateUtil也提供了相关方法
        String dateStr4 = "2017-03-01 22:33:23";
        Date date4 = DateUtil.parse(dateStr4);
        //一天的开始，结果：2017-03-01 00:00:00
        Date beginOfDay = DateUtil.beginOfDay(date4);
        //一天的结束，结果：2017-03-01 23:59:59
        Date endOfDay = DateUtil.endOfDay(date4);


        //日期时间偏移
        //日期或时间的偏移指针对某个日期增加或减少分、小时、天等等，达到日期变更的目的。Hutool也针对其做了大量封装
        String dateStr5 = "2017-03-01 22:33:23";
        Date date5 = DateUtil.parse(dateStr5);
        //结果：2017-03-03 22:33:23
        Date newDate = DateUtil.offset(date5, DateField.DAY_OF_MONTH, 2);
        //常用偏移，结果：2017-03-04 22:33:23
        DateTime newDate2 = DateUtil.offsetDay(date5, 3);
        //常用偏移，结果：2017-03-01 19:33:23
        DateTime newDate3 = DateUtil.offsetHour(date5, -3);

        //针对当前时间，提供了简化的偏移方法（例如昨天、上周、上个月等）：
        DateUtil.yesterday();//昨天
        DateUtil.tomorrow();//明天
        DateUtil.lastWeek();//上周
        DateUtil.nextWeek();//下周
        DateUtil.lastMonth();//上个月
        DateUtil.nextMonth();//下个月

        //日期时间差
        //有时候我们需要计算两个日期之间的时间差（相差天数、相差小时数等等），Hutool将此类方法封装为between方法：
        String dateStr6 = "2017-03-01 22:33:23";
        Date date6 = DateUtil.parse(dateStr6);
        String dateStr7 = "2017-04-01 23:33:23";
        Date date7 = DateUtil.parse(dateStr7);
        //相差一个月，31天
        long betweenDay = DateUtil.between(date6, date7, DateUnit.DAY);

        //格式化时间差
        //有时候我们希望看到易读的时间差，比如XX天XX小时XX分XX秒，此时使用DateUtil.formatBetween方法
        //Level.MINUTE表示精确到分
        String formatBetween = DateUtil.formatBetween(new Date().getTime(), BetweenFormatter.Level.MINUTE);
        //输出：31天1小时
        Console.log(formatBetween);

        //星座和属相
        // "摩羯座"
        String zodiac = DateUtil.getZodiac(Month.JANUARY.getValue(), 19);
        // "狗"
        String chineseZodiac = DateUtil.getChineseZodiac(1994);
        //年龄
        DateUtil.ageOfNow("1990-01-30");
        //是否闰年
        DateUtil.isLeapYear(2017);

        //日期时间对象-DateTime
        //新建对象
        //DateTime对象包含众多的构造方法，构造方法支持的参数有：
        //Date
        //Calendar
        //String(日期字符串，第二个参数是日期格式)
        //long 毫秒数
        //构建对象有两种方式：DateTime.of()和new DateTime()：
        Date date8 = new Date();
        //new方式创建
        DateTime time = new DateTime(date8);
        Console.log(time);
        //of方式创建
        DateTime now = DateTime.now();
        DateTime dt = DateTime.of(date8);

        //使用对象
        //DateTime的成员方法与DateUtil中的静态方法所对应，因为是成员方法，因此可以使用更少的参数操作日期时间。
        //示例：获取日期成员（年、月、日等）
        DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);

        //年，结果：2017
        int year = dateTime.year();

        //季度（非季节），结果：Season.SPRING
        //Season season = dateTime.seasonEnum();

        //月份，结果：Month.JANUARY
        Month month = dateTime.monthEnum();

        //日，结果：5
        int day = dateTime.dayOfMonth();

    }

}
